home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 1 / PC Actual CD 01.iso / f1 / utils1.arj / PROT2.ASM < prev    next >
Encoding:
Assembly Source File  |  1992-05-13  |  6.1 KB  |  299 lines

  1. ;             PC y COMPATIBLES
  2. ; ****************************************
  3. ; ***   PROT2.COM v1.0 / JCE May 1992  ***
  4. ; ****************************************
  5. ; Sistema de protecciones por marca fisica
  6. ;
  7. ;             Juan C. Enrique
  8. ;
  9. ; ---------------------------------------
  10. ;    Si el disco llave se encuentra en
  11. ;   drive A: escribe 'OK!',sino lo pide.
  12. ; ---------------------------------------
  13. ;      NO SE PUEDE PARAR CON CTRL+C
  14. ;
  15.  
  16. CODE_SEG        SEGMENT PUBLIC
  17.                 ASSUME  CS:CODE_SEG, DS:CODE_SEG, SS:CODE_SEG
  18.  
  19. entrada EQU     DS:82h
  20.  
  21.         ORG 100h
  22.  
  23. PROT2_COM:
  24.  
  25.         XOR     AX,AX
  26.         MOV     ES,AX
  27.         CLI
  28.         MOV     WORD PTR ES:[08CH],OFFSET INT23
  29.         MOV     WORD PTR ES:[08EH],CS
  30.         STI
  31.  
  32.  
  33.         MOV     DI,OFFSET entrada          ; entrada valor en ASCII
  34.         CALL    CONVERT                    ; conversion
  35.         MOV     WORD PTR DS:[num_sect],AX  ; almacena valor convertido en WORD
  36.  
  37.         JMP     run2
  38.  
  39. run:
  40.         MOV     DX,OFFSET MSG11
  41.     MOV    AH,9
  42.     INT    21H
  43. wait_key:
  44.         MOV     AH,1
  45.     INT    21H
  46.         CMP     AL,13                   ; espera a que se pulse ENTER
  47.     JNE    wait_key
  48.  
  49. run2:
  50.         MOV     DX,0                    ;
  51.         MOV     BX,OFFSET BUFFER        ;  Analiza el sector 0 para  saber
  52.         MOV     CX,1                    ;   si hay disco en la unidad A.
  53.  
  54.         CALL    redisk
  55.         CLC
  56.         XOR     AX,AX
  57.         INT     25H
  58.         POP     DI
  59.         JC      no_disk
  60.  
  61.         CALL    REDISK
  62.         CLC                             ; CARRY=0
  63.         XOR     AX,AX
  64.         INT     26H                     ; Reescribe sect 0
  65.         POP     DI
  66.         JC      disco_protegido
  67.  
  68.         CALL    comprueba_codigo        ; busca CODIGO en sect-1
  69.  
  70.         MOV     DX,WORD PTR DS:[num_sect]  ; num. de sector marcado
  71.         MOV     BX,OFFSET CODIGO           ; dir transferencia de RAM
  72.     MOV    CX,1
  73.  
  74.         CALL    redisk
  75.         CLC
  76.  
  77. ;        XOR     AX,AX
  78. ;        INT     26H                     ; escribe en sect marcado
  79. ;        POP     DI
  80.  
  81.         CALL    redisk
  82.     CLC
  83.         XOR     AX,AX
  84.         INT     25H                     ; Lee
  85.         POP     DI
  86.     JC    original
  87.         CALL    redisk
  88.         XOR     AX,AX
  89.         INT     25H
  90.         POP     DI
  91.         JC      original
  92.         CALL    redisk
  93.         XOR     AX,AX
  94.         INT     25H
  95.         POP     DI
  96.         JC      original
  97.  
  98. no_disco_original:
  99.         MOV     DX,OFFSET MSG1
  100.     MOV    AH,9
  101.     INT    21H
  102.     JMP    run
  103.  
  104. disco_protegido:
  105.         MOV     DX,OFFSET MSG2
  106.     MOV    AH,9
  107.     INT    21H
  108.     JMP    wait_key
  109. ; ------------------------------
  110. ; OK.  sector y codigo correctos
  111. ; ------------------------------
  112.  
  113. original:
  114.         INT     20H                     ; vuelve al DOS
  115.  
  116. no_disk:
  117.     JMP    run
  118.  
  119. ;
  120. ; comprobacion del codigo o num. de ref. intoducido por TESTDSK
  121. ;
  122.  
  123. comprueba_codigo:
  124.  
  125.     MOV    CX,1
  126.         MOV     DX,WORD PTR DS:[num_sect]
  127.     DEC    DX
  128.         MOV     BX,OFFSET BUFFER
  129.         XOR     AX,AX
  130.         CLC
  131.         INT     25H                     ; lee sect-1 y lo deja en BUFFER
  132.         POP     DI
  133.  
  134.     JC    comp_error
  135.  
  136.         MOV     BX,OFFSET BUFFER
  137.         MOV     DX,OFFSET CODIGO
  138.     MOV    CX,17
  139. comp_bucle:
  140.     PUSH    BX
  141.     PUSH    DX
  142.         MOV     AH,[BX]
  143.     MOV    DX,BX
  144.         MOV     AL,[BX]
  145.     CMP    AH,AL
  146.         JNE     no_disco_original       ; el codigo no coincide
  147.     POP    DX
  148.     POP    BX
  149.         INC     BX
  150.     INC    DX
  151.     LOOP    comp_bucle
  152.     RET
  153.  
  154. comp_error:
  155.         MOV     DX,OFFSET BEEP
  156.         MOV     AH,9
  157.         INT     21H                             ; BEEP control
  158.  
  159.     JMP    no_disco_original
  160.  
  161.  
  162. ;
  163. ; Parcheo INT23 (Break CTRL+C)
  164. ;
  165.  
  166. INT23:
  167.  
  168.         PUSH    AX
  169.         PUSH    DX
  170.  
  171.         MOV     DL,7
  172.         MOV     AL,6
  173.         MOV     AH,12
  174.         INT     21H
  175.  
  176.         POP     DX
  177.         POP     AX
  178.  
  179.         CLC                             ; Indica seguir programa
  180.  
  181.         IRET
  182.  
  183. ; ==============================
  184. ; Reinicializa sistema diskettes
  185. ; ==============================
  186.  
  187. redisk:
  188.         PUSH    AX
  189.         PUSH    DX
  190.         MOV     DL,0
  191.         XOR     AX,AX
  192.         INT     13H
  193.         POP     DX
  194.         POP     AX
  195.         RET
  196.  
  197. ;
  198. ; =============================================================
  199. ;  Esta rutina convierte el ascii de cuatro caracteres apuntado
  200. ; por DI en su correspondiente numero y lo convierte en   una
  201. ; palabra (2bytes) que devuelve en AX.
  202. ; =============================================================
  203. ;
  204.  
  205. CONVERT:
  206.         MOV     AL,BYTE PTR [DI+0]
  207.     CALL    convert_hex_digit
  208.     JC    valor_incorrecto
  209.     SHL    AL,1
  210.         SHL     AL,1
  211.         SHL     AL,1
  212.         SHL     AL,1
  213.     PUSH    AX
  214.         MOV     AL,BYTE PTR [DI+1]
  215.     JC    valor_incorrecto
  216.     CALL    convert_hex_digit
  217.     POP    BX
  218.     OR    AL,BL
  219.     MOV    AH,AL
  220.     PUSH    AX
  221.         MOV     AL,BYTE PTR [DI+2]
  222.     CALL    convert_hex_digit
  223.     JC    valor_incorrecto
  224.     SHL    AL,1
  225.         SHL     AL,1
  226.         SHL     AL,1
  227.         SHL     AL,1
  228.     PUSH    AX
  229.         MOV     AL,BYTE PTR [DI+3]
  230.     CALL    convert_hex_digit
  231.     JC    valor_incorrecto
  232.     POP    BX
  233.     OR    AL,BL
  234.     MOV    BL,AL
  235.     POP    AX
  236.     MOV    AL,BL
  237.     RET
  238.  
  239. valor_incorrecto:
  240.         JMP     valor_incorrecto                ; cuelgue
  241.  
  242. ;-----------------------------------------------------
  243. ; P.Norton:
  244. ;   Convierte el car de AL en un NIBBLE devuelto en AL
  245. ;             carry se activa si hay error
  246. ;-----------------------------------------------------
  247.  
  248. CONVERT_HEX_DIGIT:
  249.  
  250.     CMP    AL,'0'
  251.     JB    BAD_DIGIT
  252.     CMP    AL,'9'
  253.     JA    TRY_HEX
  254.     SUB    AL,'0'
  255.     CLC
  256.     RET
  257. TRY_HEX:
  258.     CMP    AL,'A'
  259.     JB    BAD_DIGIT
  260.     CMP    AL,'F'
  261.     JA    BAD_DIGIT
  262.     SUB    AL,'A'-10
  263.     CLC
  264.     RET
  265. BAD_DIGIT:
  266.     STC
  267.     RET
  268.  
  269.  
  270. ;
  271. ;  *** MENSAJES ***
  272. ;
  273.  
  274. MSG1:   db      7,10,13
  275.     db    "*** ATENCION ESTE NO ES EL DISCO-LLAVE ORIGINAL ***$$$"
  276.  
  277. MSG11:    db    10,13,"Introduzca en 'A' el disco-llave y pulse ENTER ...$$$"
  278.  
  279. MSG2:   db      10,13
  280.     db    "* Disco protegido contra escritura. Desprotejalo y "
  281.     db    "pulse ENTER *$$$"
  282.  
  283. BEEP:   db      7,"$"
  284. ;
  285.  
  286.  
  287. num_sect:
  288.         db      0,0
  289.  
  290. CODIGO: db      "JCE-06091972VIRGO$    "
  291.  
  292. BUFFER: db      0
  293.  
  294.  
  295. CODE_SEG        ENDS
  296.                 END     PROT2_COM
  297.  
  298.  
  299.